package com.igeek.boot.config;

import com.igeek.boot.entity.Car;
import com.igeek.boot.entity.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author fengqq
 * @Description 底层注解@Configuration 自定义的配置类
 * @Date 2024/8/13  14:30
 *
 * @Configuration 作用等价于@Component(默认命名策略：类名首字母小写)
 * 1.自定义配置类 相当于xml配置文件 配置类也是一个bean组件
 * 2.配置类里面使用@Bean标注在方法上面给ioc容器 注入bean实例  默认bean实例是单例
 *   @Bean(value = "",initMethod = "",destroyMethod = "")
 *   value属性指定beanName initMethod属性指定初始化方法名  destroyMethod属性指定销毁方法名
 *
 * 3.属性proxyBeanMethods
 *  * 3.1 Full模式：默认是true
 *  *       用来监测当前IOC容器中是否有此实例，若有则不会再创建，直接返回此单实例；
 *  *       当前配置类的实例信息：com.igeek.springboot.config.MyConfig1$$EnhancerBySpringCGLIB$$7c35a8af@aa21042 代理对象
 *  * 3.2 Lite模式：指定为false
 *  *       每一次调用都会创建新的实例；
 *  *       当前配置类的实例信息：com.igeek.springboot.config.MyConfig1@45673f68
 *  * 3.3 使用场景
 *          配置类组件之间无依赖关系用Lite模式加速容器启动过程，减少判断配置
 *          类组件之间有依赖关系，方法会被调用得到之前单实例组件，用Full模式（默认）
 */
@Configuration(proxyBeanMethods = false)
public class MyConfig1 {

    /**
     *  @Bean 注解
     *  1.将当前的方法的返回值 注册到IOC容器中
     *  2.默认命名策略，将方法名作为 beanName使用
     * @return
     */
    @Bean
    public Person person(){
        Person person = new Person();
        person.setName("小明");
        person.setAge(20);
        person.setCar(car());
        return person;
    }

    @Bean
    public Car car(){
        Car car = new Car("奥迪",1000000);
        return car;
    }

}
